package com.ljdemo.lrecorder.utils;

import android.graphics.Bitmap;
import android.text.format.DateFormat;
import android.util.Base64;
import android.util.Log;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Locale;

/**
 * 文件工具
 * <br/>
 * 修改日期 : 2023/6/9
 * */
public class FileUtil {

    private static final String TAG="文件工具";
    public static final int FLAG_SUCCESS = 1;//创建成功
    public static final int FLAG_EXISTS = 2;//已存在
    public static final int FLAG_FAILED = 3;//创建失败

    /**
     * 创建 单个 文件
     *
     * @param filePath 待创建的文件路径
     * @return 结果码
     */
    public static int createFile(String filePath) {
        File file = new File(filePath);
        if (file.exists()) {
            Log.e(TAG, "文件 [ " + filePath + " ] 已存在");
            return FLAG_EXISTS;
        }
        if (filePath.endsWith(File.separator)) {// 以 路径分隔符 结束，说明是文件夹
            Log.e(TAG, "文件 [ " + filePath + " ] 不能是目录");
            return FLAG_FAILED;
        }

        //判断父目录是否存在
        if (!file.getParentFile().exists()) {
            //父目录不存在 创建父目录
            Log.d(TAG, "创建父目录...");
            if (!file.getParentFile().mkdirs()) {
                Log.e(TAG, "创建父目录失败");
                return FLAG_FAILED;
            }
        }
        //创建目标文件
        try {
            if (file.createNewFile()) {//创建文件成功
                Log.i(TAG, "创建文件 [ " + filePath + " ] 成功");
                return FLAG_SUCCESS;
            }
        } catch (IOException e) {
            e.printStackTrace();
            Log.e(TAG, "创建文件 [ " + filePath + " ] 失败");
            return FLAG_FAILED;
        }
        return FLAG_FAILED;
    }

    /**
     * @return 标识名+日期时间
     * */
    public static String getFlagName(){
        return "ljdemo"+DateFormat.format("yyyyMMdd_HHmmss",
                Calendar.getInstance(Locale.CHINA));
    }

//    /**
//     * 获取文件夹下所有文件
//     * */
//    public static List<File> getFilesByFolderPath(String folderPath){
//        ArrayList<File> resultFiles=new ArrayList<>();
//        File file=new File(folderPath);
//        File[] allFile=file.listFiles();
//        for (int i=0;i<allFile.length;i++){
//            resultFiles.add(allFile[i]);
//        }
//        return resultFiles;
//    }

    /**
     * 获取文件夹下所有文件
     * */
    public static List<File> getFilesByFolderPath(String folderPath){
        ArrayList<File> filList=new ArrayList<>();
        File folder=new File(folderPath);
        File[] allFile=folder.listFiles();

        if (allFile!=null){
            for (File file : allFile){
                if (file.isDirectory()){
                    filList.addAll(getFilesByFolderPath(file.getPath()));
                }else {
                    filList.add(file);
                }
            }
        }else {
            Log.e(TAG,"文件夹下为空，路径为："+folderPath);
        }

        return filList;
    }

    /**
     * 删除文件
     * @param fileFullName 文件全名，路径+文件名
     * */
    public static void delFile(String fileFullName){
        File file=new File(fileFullName);
        if (file.exists()){
            file.delete();
        }else {
            Log.e(TAG,"删除文件时，文件不存在："+fileFullName);
            throw new RuntimeException("删除文件时，文件不存在："+fileFullName);
        }
    }

    /**
     * 复制文件，文件全名（路径+文件名）
     * @param copy 要复制的文件全名
     * @param target 目标文件夹
     * */
    public static void copyFile(String copy,String target){
        File copyFile=new File(copy);
        File targetDir=new File(target);

        InputStream in;
        OutputStream out;
        try {
            in=new FileInputStream(copyFile);
            out=new FileOutputStream(new File(targetDir,copyFile.getName()));

            byte[] buffer=new byte[1024];
            int len;
            while ((len=in.read(buffer)) > 0){
                out.write(buffer,0,len);
            }

            in.close();
            out.close();
        } catch (FileNotFoundException e) {
            Log.e(TAG,"复制文件时，文件未找到："+e.getMessage());
            throw new RuntimeException(e);
        } catch (IOException e) {
            Log.e(TAG,"复制文件时出现输入输出异常："+e.getMessage());
            throw new RuntimeException(e);
        }
    }

    /*
    // 遍历Bitmap，将其转换成Base64编码的字符串并添加到HTML中
    for (Bitmap bitmap : bitmaps) {
        String base64 = bitmapToBase64(bitmap);
        sb.append("<img src=\"data:image/jpeg;base64," + base64 + "\"/>");
    }
    * */

    /**
     * Bitmap转换成base64字符串（可传给前端）
     * */
    public static String bitmapToBase64(Bitmap bitmap){
        ByteArrayOutputStream baos=new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG,100,baos);
        byte[] bytes=baos.toByteArray();
        return Base64.encodeToString(bytes,Base64.DEFAULT);
    }

}